package san.java.day14;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * Java动态代理:
 *  Proxy: 专门完成代理的操作类,是所有动态代理类的父类. 通过此类为一个或多个接口动态的生成实现类
 *
 *  考虑需求: 现在有一个Java项目,其中有100个Java类,每个Java有10个方法,现在需要为这1000个方法,
 *      在每个方法执行前输出这个方法开始执行,在方法执行后输出这个方法已经完成
 *
 *  动态代理!!!!
 */



public class Proxy_10 {
    public static void main(String[] args) {
        ITestDemoImpl iTestDemo = new ITestDemoImpl();

        /**
         * 注意: 如果一个对象想要被代理, 通过Proxy.newProxyInstance
         *  那么这个对象的类就一定要有相应的接口
         *  就像本类中的ITestDemo接口和实现类ITestDemoImpl
         */
        iTestDemo.test1();
        iTestDemo.test2();

        /**
         * 需求:
         *  在执行test1/2()方法前,打印开始执行,执行后,打印执行完毕
         */
        InvocationHandler proxyDemo = new ProxyDemo(iTestDemo);


        /**
         * Proxy.newProxyInstance(ClassLoader, interfaces, InvocationHandler)
         * @ClassLoader: 代理对象的类加载器
         * @interfaces:  被代理对象的接口
         * @InvocationHandler: 代理对象
         */
        ITestDemo t = (ITestDemo) Proxy.newProxyInstance(proxyDemo.getClass().getClassLoader(), iTestDemo.getClass().getInterfaces(), proxyDemo);
        t.test1();
        t.test2();
    }
}
